/* 
 * File:   OperacionObtenerRepositorio.cpp
 * Author: maximiliano
 * 
 * Created on 15 de junio de 2013, 10:41
 */

#include "client_OperacionObtenerRepositorio.h"
using namespace TP::Operaciones;

OperacionObtenerRepositorio::OperacionObtenerRepositorio(const uint32_t &pToken, Repositorio **pRepositorio, FileServiceProxy* pFileService) : Operacion (pToken) {
    
    _fileService = pFileService;
    _repositorio = pRepositorio;
    
    this->setFinalizada(true);
}

OperacionObtenerRepositorio::~OperacionObtenerRepositorio() {
}

void OperacionObtenerRepositorio::ejecutar(){
    
    this->setFinalizada(false);
    _fileService->GetRepositorio(this->getId());
}

void OperacionObtenerRepositorio::procesarRespuesta (vector<string> &pRespuesta){
    
    // Formato respuesta: <token>|<recurso>|<accion>|<resultado>|<args>
    
    if (FileServiceConstants::GET_REPOSITORIO == pRespuesta[2])
    {
        ObtenerRepositorioServidorManejadorRespuesta (pRespuesta);
    }
    else
    {
        cerr << "Respuesta de servicio no reconocida" << pRespuesta[2] << endl;
        this->setFinalizada(true);
    }
}

void OperacionObtenerRepositorio::ObtenerRepositorioServidorManejadorRespuesta(vector<string> &pRespuesta){
    
    // Formato respuesta: <token>|<recurso>|<accion>|<resultado>|<args>
    
    try
    {
        if (pRespuesta[3] != FileServiceConstants::OK) 
            throw Excepcion ("Fallo al obtener el repositorio del servidor.");
        
        uint8_t* buffer = NULL;
        uint32_t longitudBuffer = 0;
        _codec.decodificar(buffer, longitudBuffer, pRespuesta[4]);
        string repositorioServidor = "";
        
        for (uint32_t i = 0; i < longitudBuffer; i++) 
        {
            repositorioServidor += (char)buffer[i];
        }
        
        *_repositorio = Repositorio::Parse(repositorioServidor);
        
        if (NULL == *_repositorio) 
        {
            throw  Excepcion ("No se puede hidratar el repositorio del servidor.");
        }
    }
    catch (Excepcion &ex)
    {
        cerr << "Fallo al sincronizar repositorios cliente-servidor. " << ex.what() << endl;
    }
    
    this->setFinalizada(true);
}
